package leetCode;

import java.util.Scanner;

public class Solution1863 {

    int n;
    int[] nums;
    int xorSum;
    
    
    private Solution1863(int n, int[] nums) {
        super();
        this.n = n;
        this.nums = nums;
    }


    public int subsetXORSum1(int[] nums) {
        int xorSum = 0;
        // 以n位二进制数状态枚举每一种不同的状态
        for (int i = 0; i < (1 << n); i++) {
            int iXorJ = 0;
            for (int j = 0; j < n; j++) {
                // 第j位为1代表取，0则不取
                if ((1 & (i >> j)) == 1) {
                    iXorJ ^= nums[j];
                }
            }
            System.out.println(xorSum);
            xorSum += iXorJ;
        }
        return xorSum;
    }
    
    // 子集问题dfs回溯
    public int subsetXORSum(int[] nums) {
        int xor = 0;
        dfs(0, xor);
        return xorSum;
    }
    

    private void dfs(int startIndex, int xor) {
        for (int i = startIndex; i < n; i++) {
            xor ^= nums[i];
            xorSum += xor;
            System.out.println(xorSum);
            dfs(i+1, xor);
            // 回溯，异或逆运算xor2 = xor1 ^ nums[i] ==> xor1 = xor2 ^ nums[i]
            xor ^= nums[i];
        }
    }


    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = scan.nextInt();
        }
        Solution1863 s = new Solution1863(n, nums);
        System.out.println(s.subsetXORSum(nums));

    }

}
